查看原文
其他

Tkinter自定义GUI界面背景logo,爆赞!

墨染 数据分析与统计学之美 2023-05-04
大家好,我是黄同学🚀
今天必须再为大家安排一篇粉丝提问的历史遗留问题喜欢的朋友记得去文末三连击一下!

遗留问题

上周日,我发布了一篇文章《8000字,详解Tkinter的GUI界面制作》。有的朋友提到了一个遗留问题,大致是这样的:
这段长文字是作者的回答,答案当然是可以。但是代码还是得自己打一遍才能理解,因此这里就不在上次的小工具里修改,想要更改上次小工具背景的小伙伴,可以看完本文后自行操作。

效果展示

Tkinter组件介绍

在上一次的文章中,相信各位对tkinter模块有了一个基础的了解,想看基础介绍的可以去前面那篇文章查看,这里就不浪费各位的时间,直接介绍今天的主角。

「Canvas」

Canvas是一个高度灵活的组件,你可以用它绘制图形和图表,创建图形编辑器,并实现各种自定义的小部件。通常被用来绘画各种图形以及放置图片。
用法:在Canvas组件上绘制对象,可以用create_xx()的方法,xx表示对象类型,例如线段line,矩形rectangle,文本text ,扇形arc,图片image,圆oval。
# 创建一个矩形,指定画布的颜色为白色
from tkinter import *

root = Tk()
cv = Canvas(root, bg='white')
cv.create_rectangle(10, 10, 200, 200)
cv.pack()
root.mainloop()
效果如下:
# 创建一个圆形,指定画布的颜色为白色
from tkinter import *

root = Tk()
cv = Canvas(root, bg='white')
cv.create_ovale(10, 10, 200, 200)
cv.pack()
root.mainloop()
效果如下:
# 创建画布,里面放上图片
from tkinter import *
from PIL import Image,ImageTk

root = Tk()
#注该代码下须有对应的图片文件
im_root = ImageTk.PhotoImage(Image.open('猫.jpg'))
canvas_root = Canvas(root, width=440, height=440)
canvas_root.create_image(220, 220, image=im_root)
canvas_root.pack()
root.mainloop()
效果如下:
tkinter只支持gif格式,在展示jpg或png等格式,需使用PIL库获得ImageTk.PhotoImage对象代替tk.PhotoImage对象。

Frame

Frame(框架)控件在屏幕上显示一个矩形区域,多用来作为容器。在一些复杂的界面设计经常用到,用来将一定范围内的组件进行分组,方便管理;亦或者在一些需要用到界面切换时,常常用到。
from tkinter import *

def change():
    frame1.pack_forget()  #将该框架隐藏
    frame2.pack()

def change1():
    frame2.pack_forget()   #将该框架隐藏
    frame1.pack()

root = Tk()
root.geometry('200x100+600+300')
frame1 = Frame(root)
frame2 = Frame(root)
Label(frame1, text="你好").grid(row=0,column=0)
Label(frame2, text="hello").grid(row=0,column=0)
Button(frame1, text="hello", command=change).grid(row=0,column=1)
Button(frame2, text="你好",command=change1).grid(row=0,column=1)
frame1.pack()
frame2.pack()
frame2.pack_forget()  #将该框架隐藏
root.mainloop()
效果如下:

完整代码

from tkinter import *
from PIL import Image,ImageTk

class tkinter():
    
    def __init__(self,root):
        self.root = root
        self.root.title("数据分析与统计学之美")  # 窗口标题栏
        self.root.geometry('640x360+600+300')  # 窗口大小
        self.root.resizable(width=FALSE, height=FALSE)  # 限制窗口大小,拒绝用户调整边框大小
        self.frame=Frame(self.root,borderwidth=0)       #创建两个框架
        self.frame1=Frame(self.root)

    def homepage(self):
        global im_root, im_root1        # 注,在类里需将放置图片的对象定义为全局变量
        im_root = ImageTk.PhotoImage(Image.open('草原.png'))   #打开图片
        im_root1 = ImageTk.PhotoImage(Image.open('草原一角.png'))
        canvas_root = Canvas(self.frame, width=640, height=360)
        canvas_root.create_image(320, 180, image=im_root)   #放置图片
        canvas_root.pack()
        Button(self.frame, text="切换背景为日出",borderwidth=0, image=im_root1,command=self.switch_button,compound="center").place(width=200, height=50,x=1,y=2)
        self.frame.pack()
        self.Se_page()      #先将两个框架内容展示出来,再将其中一个隐藏起来
        self.frame1.pack_forget()   #隐藏第二个框架的内容

    def switch_button(self):    #隐藏第一个框架内容,展示第二个框架内容
        self.frame.pack_forget()
        self.frame1.pack()

    def Se_page(self):
        global im_root2, im_root3       # 注,在类里需将放置图片的对象定义为全局变量
        im_root2 = ImageTk.PhotoImage(Image.open('日出.png'))
        im_root3 = ImageTk.PhotoImage(Image.open('日出一角.png'))
        canvas_root = Canvas(self.frame1, width=640, height=360)
        canvas_root.create_image(320, 180, image=im_root2)
        canvas_root.pack()
        Button(self.frame1, text="背景切换为草原",borderwidth=0, image=im_root3,command=self.switch_button1,compound="center").place(width=200, height=50,x=440,y=2)
        self.frame1.pack()

    def switch_button1(self): #隐藏第二个框架内容,展示第一个框架内容
        self.frame1.pack_forget()
        self.frame.pack()

if __name__ == '__main__':
    root = Tk()
    tk = tkinter(root)
    tk.homepage()
    root.mainloop()
如代码所示,在tkinter类里定义两个框架,用来放置不同的内容。
def homepage(self):
    global im_root, im_root1        # 注,在类里需将放置图片的对象定义为全局变量
    im_root = ImageTk.PhotoImage(Image.open('草原.png'))   #打开图片
    im_root1 = ImageTk.PhotoImage(Image.open('草原一角.png'))
    canvas_root = Canvas(self.frame, width=640, height=360)
    canvas_root.create_image(320, 180, image=im_root)   #放置图片
    canvas_root.pack()
    Button(self.frame, text="切换背景为日出",borderwidth=0, image=im_root1,command=self.switch_button,compound="center").place(width=200, height=50,x=1,y=2)
    self.frame.pack()
    self.Se_page()      #先将两个框架内容展示出来,再将其中一个隐藏起来
    self.frame1.pack_forget()   #隐藏第二个框架的内容
两个框架思路代码相同,这里只介绍第一个框架。框架里先打开我们要作为背景的图片,利用画布将图片放置上去作为框架的背景,再放置一个用来切换的按钮,由于按钮如果没有添加背景图片会显得很突兀。
因此我们可以处理一下图片,首先决定按钮要位于图片的哪个地方,然后打开截图工具,将按钮所在位置的内容截图下来,作为按钮的背景。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存